home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPSQRT.SA < prev    next >
Text File  |  1989-08-30  |  5KB  |  117 lines

  1.       TTL    FAST FLOATING POINT SQUARE ROOT (FFPSQRT)
  2. *******************************************
  3. * (C)  COPYRIGHT 1981 BY MOTOROLA INC.    *
  4. *******************************************
  5.  
  6. ********************************************
  7. *           FFPSQRT SUBROUTINE             *
  8. *                                          *
  9. * INPUT:                                   *
  10. *          D7 - FLOATING POINT ARGUMENT    *
  11. *                                          *
  12. * OUTPUT:                                  *
  13. *          D7 - FLOATING POINT SQUARE ROOT *
  14. *                                          *
  15. * CONDITION CODES:                         *
  16. *                                          *
  17. *          N - CLEARED                     *
  18. *          Z - SET IF RESULT IS ZERO       *
  19. *          V - SET IF ARGUMENT WAS NEGATIVE*
  20. *          C - CLEARED                     *
  21. *          X - UNDEFINED                   *
  22. *                                          *
  23. *    REGISTERS D3 THRU D6 ARE VOLATILE     *
  24. *                                          *
  25. * CODE: 194 BYTES    STACK WORK: 4 BYTES   *
  26. *                                          *
  27. * NOTES:                                   *
  28. *   1) NO OVERFLOWS OR UNDERFLOWS CAN      *
  29. *      OCCUR.                              *
  30. *   2) A NEGATIVE ARGUMENT CAUSES THE      *
  31. *      ABSOLUTE VALUE TO BE USED AND THE   *
  32. *      "V" BIT SET TO INDICATE THAT A      *
  33. *      NEGATIVE SQUARE ROOT WAS ATTEMPTED. *
  34. *                                          *
  35. * TIMES:                                   *
  36. * ARGUMENT ZERO         3.50 MICROSECONDS  *
  37. * MINIMUM TIME > 0    187.50 MICROSECONDS  *
  38. * AVERAGE TIME > 0    193.75 MICROSECONDS  *
  39. * MAXIMUM TIME > 0    200.00 MICROSECONDS  *
  40. ********************************************
  41.          PAGE
  42. FFPSQRT  IDNT 1,1  FFP SQUARE ROOT
  43.  
  44.        SECTION   9
  45.  
  46.       XDEF   FFPSQRT   ENTRY POINT
  47.       XREF   FFPCPYRT  COPYRIGHT NOTICE
  48.  
  49. * NEGATIVE ARGUMENT HANDLER
  50. FPSINV   AND.B     #$7F,D7   TAKE ABSOLUTE VALUE
  51.          BSR.S     FFPSQRT   FIND SQRT(ABS(X))
  52. *        OR.B      $02,CCR   SET "V" BIT
  53.          DC.L      $003C0002 **ASSEMBLER ERROR**
  54.          RTS                 RETURN TO CALLER
  55.  
  56. *********************
  57. * SQUARE ROOT ENTRY *
  58. *********************
  59. FFPSQRT  MOVE.B    D7,D3     COPY S+EXPONENT OVER
  60.          BEQ.S     FPSRTN    RETURN ZERO IF ZERO ARGUMENT
  61.          BMI.S     FPSINV    NEGATIVE, REJECT WITH SPECIAL CONDITION CODES
  62.          LSR.B     #1,D3     DIVIDE EXPONENT BY TWO
  63.          BCC.S     FPSEVEN   BRANCH EXPONENT WAS EVEN
  64.          ADD.B     #1,D3     ADJUST ODD VALUES UP BY ONE
  65.          LSR.L     #1,D7     OFFSET ODD EXPONENT'S MANTISSA ONE BIT
  66. FPSEVEN  ADD.B     #$20,D3   RENORMALIZE EXPONENT
  67.          SWAP.W    D3        SAVE RESULT S+EXP FOR FINAL MOVE
  68.          MOVE.W    #23,D3    SETUP LOOP FOR 24 BIT GENERATION
  69.          LSR.L     #7,D7     PREPARE FIRST TEST VALUE
  70.          MOVE.L    D7,D4     D4 - PREVIOUS VALUE DURING LOOP
  71.          MOVE.L    D7,D5     D5 - NEW TEST VALUE DURING LOOP
  72.          MOVE.L    A0,D6     SAVE ADDRESS REGISTER
  73.          LEA       FPSTBL(PC),A0 LOAD TABLE ADDRESS
  74.          MOVE.L    #$00800000,D7 D7 - INITIAL RESULT (MUST BE A ONE)
  75.          SUB.L     D7,D4     PRESET OLD VALUE IN CASE ZERO BIT NEXT
  76.          SUB.L     #$01200000,D5 COMBINE FIRST LOOP CALCULATIONS
  77.          BRA.S     FPSENT    GO ENTER LOOP CALCULATIONS
  78.  
  79. *                   SQUARE ROOT CALCULATION
  80. * THIS IS AN OPTIMIZED SCHEME FOR THE RECURSIVE SQUARE ROOT ALGORITHM:
  81. *
  82. *  STEP N+1:
  83. *     TEST VALUE <= .0  0  0  R  R  R  0 1  THEN GENERATE A ONE IN RESULT R
  84. *                     N  2  1  N  2  1        ELSE A ZERO IN RESULT R      N+1
  85. *                                                                    N+1
  86. * PRECALCULATIONS ARE DONE SUCH THAT THE ENTRY IS MIDWAY INTO STEP 2
  87.  
  88. FPSONE   BSET      D3,D7     INSERT A ONE INTO THIS POSITION
  89.          MOVE.L    D5,D4     UPDATE NEW TEST VALUE
  90. FPSZERO  ADD.L     D4,D4     MULTIPLY TEST RESULT BY TWO
  91.          MOVE.L    D4,D5     COPY IN CASE NEXT BIT ZERO
  92.          SUB.L     (A0)+,D5  SUBTRACT THE '01' ENDING PATTERN
  93.          SUB.L     D7,D5     SUBTRACT RESULT BITS COLLECTED SO FAR
  94. FPSENT   DBMI      D3,FPSONE BRANCH IF A ONE GENERATED IN THE RESULT
  95.          DBPL      D3,FPSZERO BRANCH IF A ZERO GENERATED
  96.  
  97. * ALL 24 BITS CALCULATED. NOW TEST RESULT OF 25TH BIT
  98.          BLS.S     FPSFIN    BRANCH NEXT BIT ZERO, NO ROUNDING
  99.          CMP.L     #$00FFFFFF,D7   INSURE NO OVERFLOW
  100.          BEQ.S     FPSFIN    BRANCH MANTISSA ALL 1'S
  101.          ADD.L     #1,D7     ROUND UP (CANNOT OVERFLOW)
  102. FPSFIN   LSL.L     #8,D7     NORMALIZE RESULT
  103.          MOVE.L    D6,A0     RESTORE ADDRESS REGISTER
  104.          SWAP.W    D3        RESTORE S+EXP SAVE
  105.          MOVE.B    D3,D7     MOVE IN FINAL SIGN+EXPONENT
  106. FPSRTN   RTS                 RETURN TO CALLER
  107.  
  108. * TABLE TO FURNISH '01' SHIFTS DURING THE ALGORITHM LOOP
  109. FPSTBL   DC.L      1<<20,1<<19,1<<18,1<<17,1<<16,1<<15
  110.          DC.L      1<<14,1<<13,1<<12,1<<11,1<<10,1<<9,1<<8
  111.          DC.L      1<<7,1<<6,1<<5,1<<4,1<<3,1<<2,1<<1,1<<0
  112.          DC.L      0,0
  113.  
  114.          END
  115.  
  116.  
  117.